package com.riteny.util.exception;

import com.riteny.ApiCommonExceptionHandler;
import com.riteny.util.exception.entity.CommonException;
import com.riteny.util.exception.handler.AbstractCustomExceptionHandler;
import com.riteny.util.exception.handler.CustomExceptionHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Riteny
 * <p>
 * Update by Riteny 2021/12/1
 * 用於存放所有異常處理自定義操作對象的代理
 * <p>
 * 2021/9/10  16:47
 */
public class ExceptionHandlerAgent {

    private static List<CustomExceptionHandler> customExceptionHandlers = new ArrayList<>();

    /**
     * 添加自定義異常處理對象
     * 通常有{@link AbstractCustomExceptionHandler#AbstractCustomExceptionHandler()}初始化時調用
     *
     * @param exceptionHandler 自定義異常處理對象
     * @param <E>              異常對象
     */
    public static <E extends CommonException> void addHandler(CustomExceptionHandler<E> exceptionHandler) {
        customExceptionHandlers.add(exceptionHandler);
    }

    /**
     * 獲取對應的自定義異常處理對象
     * <p>
     * 在攔截到需要統一處理的異常后，有{@link ApiCommonExceptionHandler} 發起調用
     *
     * @param e   異常對象
     * @param <E> 異常對象
     * @return 自定義異常處理對象
     */
    public static <E extends CommonException> CustomExceptionHandler getHandler(E e) {

        for (CustomExceptionHandler customExceptionHandler : customExceptionHandlers) {
            if (customExceptionHandler.isInstanceOfCustomException(e)) {
                return customExceptionHandler;
            }
        }

        return null;
    }

}
